Skip to content

复制模块

Python 中,值引用的数据类型可以直接通过赋值的方式进行复制,例如:

python
color1 = 'pink'
color2 = color1
color2 = 'white'
print(color1) #打印出pink
print(color2) #打印出white

color2 复制 color1 之后,修改 color2,不影响 color1。


地址引用的数据类型直接赋值并不能复制出一个新的数据对象,例如:

python
colors = ['red', 'green', 'blue']
new_colors = colors
new_colors[0] = 'pink'
print(new_colors) #打印出['pink', 'green', 'blue']
print(colors) #打印出['pink', 'green', 'blue']

new_colors 复制 colors 之后,修改 new_colors,会影响 colors。

在这个时候,就需要引入 copy 模块,来实现地址引用对象的复制。

copy

copy(x)

copy 方法,将对象 x 里的元素复制,形成一个新的独立的对象。

python
import copy
colors = ['red', 'green', 'blue']
new_colors = copy.copy(colors)
new_colors[0] = 'pink'
print(new_colors) #打印出['pink', 'green', 'blue']
print(colors) #打印出['red', 'green', 'blue']

现在 new_colors 复制 colors 之后,修改 new_colors,不会影响 colors。

浅复制

但是 copy(x)方法只能实现浅复制,即 x 中内部如果还有地址引用对象时,他们还是被复制了地址,而不是全新的对象。例如:

python
import copy
colors = [
    ['red', 'green', 'blue'],
    ['black', 'white', 'gray']
]
new_colors = copy.copy(colors)
new_colors[0][0] = 'pink'
print(new_colors) #打印出[['pink', 'green', 'blue']['black', 'white', 'gray']]
print(colors) #打印出[['pink', 'green', 'blue']['black', 'white', 'gray']]

new_colors 浅复制 colors 之后,修改 new_colors,会影响 colors。

所以,接下来需要用到 deepcopy 方法,来实现深复制。

deepcopy

deepcopy(x)

deepcopy 方法,将对象 x 里的元素深复制,形成一个新的独立的对象。

python
import copy
colors = [
    ['red', 'green', 'blue'],
    ['black', 'white', 'gray']
]
new_colors = copy.deepcopy(colors)
new_colors[0][0] = 'pink'
print(new_colors) #打印出[['pink', 'green', 'blue']['black', 'white', 'gray']]
print(colors) #打印出[['red', 'green', 'blue']['black', 'white', 'gray']]

new_colors 浅复制 colors 之后,修改 new_colors,不会影响 colors。